/**
 * @ProjectName: go-learn-demo
 * @PackageName: _2_os
 * @Description: os包的学习。
 * @Author: hy.bai
 * @Date: 2025-08-01 10:52
 */
package osybxb

import (
	"fmt"
	"os"
)

var workplace string = "D:\\works\\Golang"

// 1.获取当前目录
func TestOsGetwd() {
	currentDir, err := os.Getwd() // 获取当前目录。等价于pwd命令
	if err != nil {
		fmt.Printf("获取当前目录异常:%v\n", err)
	} else {
		fmt.Printf("当前目录:%s\n", currentDir)
		// 打印:当前目录:D:\works\Golang\workspace\go-learn-demo
	}
}

// 2.修改当前目录: changes directory
func TestChandir() {
	// err := os.Chdir(workplace) // 修改当前目录
	err := os.Chdir("../") // 进入上次目录
	// 即:可以指定当前路径
	if err != nil {
		fmt.Printf("修改目录异常:%v\n", err)
	}
	dir, _ := os.Getwd()
	fmt.Printf("修改后的当前目录是:%v\n", dir) // 打印:修改后的当前目录是:D:\works\Golang\workspace
}

// 3.创建指定目录,且不可以创建多级目录.
// 注意:Mkdir方法的参数可以是绝对路径,也可以是相对路径,指定相对路径时，是相对当前路径(os.Getwd())来确定的。但是不能创建多级目录
// 注：创建的路径不能已经存在了，否则会抛出异常：mkdir abc: Cannot create a file when that file already exists.
func TestMkdir() {
	// os.Mkdir方法是创建文件夹, 只有一个返回值err。
	// 第1个参数是要创建的文件，第2个参数设置是权限,JI：文件夹的访问权限
	// mkdirErr := os.Mkdir(workplace+"\\abc", os.ModePerm) // os.ModePerm是0777
	// 注意:Mkdir方法的参数可以是绝对路径,也可以是相对路径,指定相对路径时，是相对当前路径(os.Getwd())来确定的。但是不能创建多级目录
	mkdirErr := os.Mkdir("abc", os.ModePerm) // os.ModePerm是0777
	fmt.Printf("创建文件夹异常:%v\n", mkdirErr)
}

// 4.删除文件或文件夹
func TestRemove() {
	// 删除文件或文件夹。即使文件或文件夹不存在时，也不会报错
	removeErr := os.RemoveAll(workplace + "\\abc.txt")
	fmt.Printf("移除文件夹异常:%v\n", removeErr)
}

// 5.修改文件夹或者文件的名称
func TestRename() {
	// 重命名文件夹或者文件
	renameErr := os.Rename(workplace+"/abc", workplace+"/new_demo_go")
	fmt.Printf("重命名文件夹异常:%v\n", renameErr)
	// 可能存在问题：重命名文件夹异常:rename D:\works\Golang/abc new_demo_go: Access is denied.
}

// 6.新建文件
func TestCreateFile() {
	// 创建文件夹,返回值file是指针类型，即：*File
	resultFile, createErr := os.Create(workplace + "/file.txt")
	if createErr != nil {
		fmt.Printf("新建文件异常:%v\n", createErr)
	} else {
		fileInfo, _ := resultFile.Stat()
		fmt.Printf("新建的文件信息:%v\n", fileInfo)
		fmt.Printf("新建的文件名字:%v, 模式:%v\n", fileInfo.Name(), fileInfo.Mode())
		// 新建的文件名字:file.txt, 模式:-rw-rw-rw-
	}
}

// 7.打开文件并写入文件
func TestOpenFile() {
	//TestCreateFile()
	//O_RDONLY：打开只读文件
	//O_WRONLY：打开只写文件
	//O_RDWR:打开既可以读取又可以写入文件
	//O_APPEND：写入文件时将数据追加到文件尾部
	//O_CREATE：如果文件不存在，则创建一个新的文件
	openFile, openErr := os.OpenFile(workplace+"/file.txt", os.O_RDWR|os.O_APPEND, 0666)
	// os.O_RDWR|os.O_APPEND:打开文件写入，并追加
	if openErr != nil {
		fmt.Printf("打开文件异常:%v\n", openErr)
	}
	// 注意:写入数据时，会覆盖文件中原有的数据。如果想追加，则加上os.O_APPEND
	length, _ := openFile.Write([]byte("hello world, 我叫柏华洋\n"))
	fmt.Printf("写入长度是:%d", length)
	openFile.WriteString("你好~ golang\n")
	// 注意：打开文件之后，一定要关闭
	openFile.Close()
}
